#include <stdio.h>
#include <stdlib.h>
#include "coro.h"

#define N 8

coro_t *coro_p;
coro_t *coro_f;
coro_t *coro_c;

void produce()
{
	int i;

	puts("-- PRODUCE --");
	for (i = 0; i < N; i++) {
		int x = i;
		printf("produce %d\n", x);
		coro_yield(x);
	}
	puts("\t-- NEVER REACH HERE --");
}

void filter()
{
	int i;

	puts("\t-- FILTER --");
	for (i = 0; i < N; i++) {
		int x = coro_resume(coro_p);
		int temp = x * 10;
		printf("\tfilter %d -> %d\n", x, temp);
		coro_yield(temp);
	}
}

void consume()
{
	int i;

	puts("\t\t-- CONSUMER --");
	for (i = 0; i < N; i++) {
		int x = coro_resume(coro_f);
		printf("\t\tconsumer %d\n", x);
	}
	puts("-- END --");
	exit(0);
}

int main()
{
    coro_p = coro_new(produce);
    coro_f = coro_new(filter);
    coro_c = coro_new(consume);
	
    printf("-- BEGIN --\n");
    coro_boot(coro_c);

    return 0;
}
